#ifndef THREAD_POOL_H
#define THREAD_POOL_H

#include <stdbool.h>
#include <pthread.h>

/**
 * @struct Task
 * @brief 表示线程池中的一个任务
 *
 * @var function 任务函数指针，格式为 void* func(void* arg)
 * @var arg 传递给任务函数的参数
 * @var next 指向下一个任务的指针
 */
typedef struct Task
{
    void *(*function)(void *); ///< 任务执行函数
    void *arg;                 ///< 传递给任务函数的参数
    struct Task *next;         ///< 指向下一个任务的指针
} Task;

/**
 * @struct ThreadPool
 * @brief 线程池结构体
 *
 * @var mutex 互斥锁，保护线程池内部状态
 * @var cond 条件变量，用于任务通知
 * @var threads 工作线程数组
 * @var task_queue_head 任务队列头指针
 * @var task_queue_tail 任务队列尾指针
 * @var shutdown 关闭标志，true表示线程池正在关闭
 * @var started 启动标志，true表示线程池已创建
 * @var thread_count 线程池中的工作线程数量
 * @var task_count 当前队列中的任务数量
 */
typedef struct ThreadPool
{
    pthread_mutex_t mutex; ///< 互斥锁，保护线程池内部状态
    pthread_cond_t cond;   ///< 条件变量，用于任务通知
    pthread_t *threads;    ///< 工作线程数组
    Task *task_queue_head; ///< 任务队列头指针
    Task *task_queue_tail; ///< 任务队列尾指针
    bool shutdown;         ///< 关闭标志，true表示线程池正在关闭
    bool started;          ///< 启动标志，true表示线程池已创建
    int thread_count;      ///< 线程池中的工作线程数量
    int task_count;        ///< 当前队列中的任务数量
} ThreadPool;

/**
 * @brief 创建线程池
 *
 * @param thread_count 线程池中的工作线程数量
 * @return 成功返回ThreadPool指针，失败返回NULL
 */
ThreadPool *thread_pool_create(int thread_count);

/**
 * @brief 向线程池添加任务
 *
 * @param pool 线程池实例
 * @param task_func 任务函数指针
 * @param arg 传递给任务函数的参数
 * @return 成功返回true，失败返回false
 */
bool thread_pool_add_task(ThreadPool *pool, void *(*task_func)(void *), void *arg);

/**
 * @brief 销毁线程池
 *
 * @param pool 线程池实例指针
 */
void thread_pool_destroy(ThreadPool *pool);

#endif
